package ar.com.larreta.procesos;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;

import ar.com.larreta.cambiador.Cambiador;
import ar.com.larreta.comunes.Objeto;
import ar.com.larreta.comunes.Propiedades;
import ar.com.larreta.excepciones.Excepcion;


public class AdministradorDeProcesos extends Objeto{

	public static final String CAMBIADOR = "cambiador";
	
	private Map<String, Proceso> procesos = new HashMap<String, Proceso>();
	private static AdministradorDeProcesos instancia;
	private PropertyPlaceholderConfigurer cfg;
	private Propiedades propiedades;
	private Cambiador cambiador;
	
	public Cambiador getCambiador() {
		return cambiador;
	}

	private AdministradorDeProcesos(String rutaArchivoConfiguracion){
		super();
		if (rutaArchivoConfiguracion!=null){
			try {
				propiedades = new Propiedades(rutaArchivoConfiguracion);
				logger.debug("Path:" + propiedades.getPath());
				cfg = new PropertyPlaceholderConfigurer();
				cfg.setLocation(new FileSystemResource(propiedades.getPath()));
			} catch (Exception e){
				logger.error(Excepcion.getStackTrace(e));
			}
		}
	}
	
	public static AdministradorDeProcesos getInstancia(String rutaArchivoConfiguracion){
		if (instancia==null){
			instancia = new AdministradorDeProcesos(rutaArchivoConfiguracion);
		}
		return instancia;
	}
	
	
	
	public Proceso getProceso (String nombreProceso){
		Proceso proceso = get(nombreProceso);
		proceso.setNombre(nombreProceso);
		return proceso;
	}
	
	private Proceso get(String proceso) {
		if (proceso!=null){
			Proceso beanProceso = procesos.get(proceso);
			if (beanProceso==null){
				Integer comienzo = proceso.lastIndexOf("/") + 1;
				Integer fin = proceso.indexOf(".");
		
				ClassPathResource classPathResource = new ClassPathResource(proceso);
				XmlBeanFactory beanFactory = new XmlBeanFactory(classPathResource);
				if (cfg!=null){
					cfg.postProcessBeanFactory(beanFactory);
				}
				
				if (cambiador==null){
					cambiador = (Cambiador) beanFactory.getBean(CAMBIADOR);
				}
								
				beanProceso = (Proceso) beanFactory.getBean(proceso.substring(comienzo, fin));
				logger.debug("Retornando proceso:" + proceso);
				logger.debug("Path del proceso:" + classPathResource.getPath());
				procesos.put(proceso, beanProceso);
			}
			return beanProceso;
		}
		return null;
	}

	public Propiedades getPropiedades() {
		return propiedades;
	}
}
